package com.coderfans.redis;

import java.util.List;

/**
 * Created by ${fanchunshuai} on 2016-10-11.
 *
 * @version: V1.0
 * @Desc:  redis  list数据结构接口
 * @Copyright (c) 2016 58到家-版权所有
 */
public interface IListRedis {
    /**
     * 从左边插入一个，或者多个值
     * @param field
     * @param key
     * @param value
     * @param <T>
     * @return
     */
    <T> long lpush(String field, String key, T... value);

    /**
     * 从右边插入一个，或者多个值
     * @param field
     * @param key
     * @param value
     * @param <T>
     * @return
     */
    <T> long rpush(String field, String key, T... value);

    /**
     * 从左边插入一个值
     * @param field
     * @param key
     * @param value
     * @param <T>
     * @return
     */
    <T> long lpushx(String field, String key, T value);

    /**
     *  从右边插入一个值
     * @param field
     * @param key
     * @param value
     * @param <T>
     * @return
     */
    <T> long rpushx(String field, String key, T value);

    /**
     * 从左边取出一个值
     * @param field
     * @param key
     * @param <T>
     * @return
     */
    <T> T lpop(String field, String key, Class<T> value);

    /**
     * 阻塞从左边取出一个值，并且有时间限制
     * @param field
     * @param key
     * @param timeout
     * @param <T>
     * @return
     */
    <T> T blpop(String field, String key, int timeout, Class<T> value);


    /**
     * 阻塞从左边取出一个值
     * @param field
     * @param key
     * @param <T>
     * @return
     */
    <T> List<T> blpop(String field, String key, Class<T> value);


    /**
     * 阻塞从右边取出一个值
     * @param field
     * @param key
     * @param <T>
     * @return
     */
    <T> List<T> brpop(String field, String key);

    /**
     * 阻塞从右边取出一个值，有时间限制
     * @param field
     * @param key
     * @param timeout
     * @param <T>
     * @return
     */
    <T> T brpop(String field, String key, int timeout);

    /**
     * 从右边取出一个值
     * @param field
     * @param key
     * @param <T>
     * @return
     */
    <T> T rpop(String field, String key);

    /**
     * 返回index所在的值
     * @param field
     * @param key
     * @param index
     * @param <T>
     * @return
     */
    <T> T lindex(String field, String key, long index, Class<T> value);

    /**
     * 获取list长度
     * @param field
     * @param key
     * @return
     */
    long llen(String field, String key);


    /**
     * 删除list中指定元素的值
     * @param field
     * @param key
     * @param count
     * @param value
     * @param <T>
     * @return
     */
    <T> long lrem(String field, String key, long count, T value);

    /**
     * 指定index的值
     * @param field
     * @param key
     * @param value
     * @param index
     * @param <T>
     * @return
     */
    <T> boolean lset(String field, String key, T value, long index);

    /**
     * 是否可以截取start-stop的list值
     * @param field
     * @param key
     * @param start
     * @param stop
     * @return
     */
    boolean ltrim(String field, String key, long start, long stop);

    /**
     * 截取start-stop的list值
     * @param field
     * @param key
     * @param start
     * @param stop
     * @param <T>
     * @return
     */
    <T> List<T> lrange(String field, String key, long start, long stop);
}
